iT邦幫忙

第 11 屆 iThome 鐵人賽

4
Modern Web

淺談資料庫&ASP.net&C# 入門系列 第 34

[iT鐵人賽Day34]SQL Server 實用的排序函數 ROW_NUMBER()

  • 分享至 

  • xImage
  •  

ROW_NUMBER()

ROW_NUMBER()是SQL用來做排序的函數,在做分頁功能時,通常都會使用上它,ROW_NUMBER()會將查詢出來的每一列資料加上一個序號(從1開始累加),依次排序且不會重複。

使用ROW_NUMBER()時必須要用OVER子句選擇對某一列進行排序才能生成序號。

使用方法:

Select ROW_NUMBER() OVER (ORDER BY [欄位名稱] (ASC or DESC) as [ROW_NUMBERㄉ欄位名稱] ,* from [資料表名稱]

使用範例:

Customers資料表

https://ithelp.ithome.com.tw/upload/images/20191007/20119925IQQzLJNLTI.png

使用ROW_NUMBER()

select ROW_NUMBER() OVER (ORDER BY id ASC) as ROW_ID ,* from Customers

顯示結果

https://ithelp.ithome.com.tw/upload/images/20191007/20119925R23fJ8iPQh.png

結果中的ROW_ID欄位,就是由ROW_NUMBER()函式所產生出的欄位序號列。原理是先使用OVER子句中的ORDER BY排序對資料進行排序,然後按照這個順序生成序號,由1開始一直流水編號到最後一筆資料。

分組排序

範例:

select ROW_NUMBER() OVER (PARTITION BY address ORDER BY id ASC) as ROW_ID ,* from Customers

結果:
https://ithelp.ithome.com.tw/upload/images/20191007/20119925MjbyUGOAfd.png

多對address下PARTITION BY條件,會發現ROW_NUMBER()產生的ROW_ID欄位,會依照組別來產生流水號。

要取出每個群組的第一筆資料,就可以使用這個方法,如下:

select * from (select ROW_NUMBER() OVER (PARTITION BY address ORDER BY id ASC) as ROW_ID ,* from Customers)as KKK where KKK.ROW_ID =1 

結果:

https://ithelp.ithome.com.tw/upload/images/20191007/20119925OaKFjcXdC0.png


上一篇
[iT鐵人賽Day33] SQL Server 暫存表(@ # ##)與CTE (Common Table Expressions)
下一篇
[iT鐵人賽Day35]ASP.NET-使用者控制項-分頁的用法
系列文
淺談資料庫&ASP.net&C# 入門36
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
Ho.Chun
iT邦新手 5 級 ‧ 2021-10-18 14:28:30

清楚明瞭! 感謝 /images/emoticon/emoticon41.gif

我要留言

立即登入留言